/**
 * 
 */
package br.com.mkmts.business.impl;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.com.mkmts.business.VendaBO;
import br.com.mkmts.dao.cadastro.ClienteDao;
import br.com.mkmts.dao.cadastro.EstoqueDao;
import br.com.mkmts.dao.cadastro.VendaDao;
import br.com.mkmts.dto.VendaDTO;
import br.com.mkmts.model.constants.TipoFluxoEstoqueEnum;
import br.com.mkmts.utils.Adapter;
import br.com.mkmts.utils.MkmtsUtil;
import br.com.mkmts.view.constants.FormaDePagamentoEnum;
import br.com.mkmts.view.controller.menu.vendas.constants.VendaUtils;

/**
 * @author christopher.rozario
 */
@Service
public class VendaBOImpl implements VendaBO {

	@Autowired
	private VendaDao dao = null;

	@Autowired
	private EstoqueDao daoEstoque = null;

	@Autowired
	private ClienteDao daoCliente = null;

	@Override
	public List<VendaDTO> listarVendas() {
		return filtrarVenda(null, null, null, null);
	}

	@Override
	public VendaDTO efetuarVenda(VendaDTO venda) {
		final Date dtVenda = new Date();
		if(venda.getFormaDePagamento().equals(FormaDePagamentoEnum.CREDITO)){
			if(venda.getNumeroParcelas() > 1){
				venda.setPossuiParcelas(true);
				venda.setValorVenda(venda.getValorVenda());
				venda.setValorParcelas(VendaUtils.calcularValorDasParcelasPorVenda(venda));
			}else{
				venda.setPossuiParcelas(false);
				venda.setNumeroParcelas(0);
				venda.setValorParcelas(BigDecimal.ZERO);
			}
		}else{
			venda.setPossuiParcelas(false);
			venda.setValorVenda(venda.getValorVenda());
			venda.setNumeroParcelas(0);
			venda.setValorParcelas(BigDecimal.ZERO);
		}
		
		for (int i = 0; i < venda.getListaDeProdutos().size(); i++) {
			venda.getListaDeProdutos().get(i).setDataVendaProduto(dtVenda);
			venda.getListaDeProdutos().get(i).setTipoFluxoEstoque(TipoFluxoEstoqueEnum.SAIDA_VENDA);
		}
		
		if(!daoCliente.existsSaleForClient(venda.getCliente().getCodCliente())){
			venda.getCliente().setDataPrimeiraVenda(dtVenda);
			daoCliente.update(Adapter.dtoToEntity(venda.getCliente()));
		}
		
		venda.getCliente().setDataUltimaVenda(dtVenda);
		venda.setQtdeTotalPontosVendidos(VendaUtils.calcularTotalPontosVendidosPorVenda(venda));
		venda.setDataVenda(dtVenda);
		VendaDTO retorno  = Adapter.entityToDto(dao.insert(Adapter.dtoToEntity(venda)));//registro a venda;
		daoEstoque.updateProductsStock(venda.getListaDeProdutos());//atualizo o estoque;
		
		return retorno;
	}
	
	@Override
	public List<VendaDTO> filtrarVenda(String codVendaFiltro,
			String nomeClienteFiltro, Date dataInicioFiltro,
			Date dataFinalFiltro) {

		List<VendaDTO> retorno = dao.salesFilter(MkmtsUtil.verificaStringNulaInteger(codVendaFiltro)
				, MkmtsUtil.verificaStringNula(nomeClienteFiltro)
				, dataInicioFiltro
				, dataFinalFiltro);
		
		return retorno;
	}

	public VendaDao getDao() {
		return dao;
	}

	public void setDao(VendaDao dao) {
		this.dao = dao;
	}

	public EstoqueDao getDaoEstoque() {
		return daoEstoque;
	}

	public void setDaoEstoque(EstoqueDao daoEstoque) {
		this.daoEstoque = daoEstoque;
	}

	
}
